﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Library.Data.Security.Encryption;

namespace UnigenReport.Form
{
    public partial class ucWorldOrderEdit : UserControl
    {
        private WorldOrder refData;
        private UnigenDataContext db;
        private bool action;//True: Add, False: Update

        #region Thiết lập

        public ucWorldOrderEdit()
        {
            InitializeComponent();
            //Phân quyền
            if (Variables.UserRoleID == 0) btnSave.Enabled = false;
            SetEvent();

            action = true;
        }

        /// <summary>
        /// Hàm show ra ngoài cho việc update
        /// </summary>
        /// <param name="refData"></param>
        /// <returns></returns>
        public ucWorldOrderEdit ForUpdate(WorldOrder obj)
        {
            refData = obj;
            action = false;
            return this;
        }

        /// <summary>
        /// Khai báo các sự kiện
        /// </summary>
        private void SetEvent()
        {
            Load += OnLoad;
            this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
            this.cboProduct.KeyDown += new System.Windows.Forms.KeyEventHandler(this.cboProduct_KeyDown);
            this.txtShipped.ValueChanged += new System.EventHandler(this.txtOrdered_ValueChanged);
            this.txtOrdered.ValueChanged += new System.EventHandler(this.txtOrdered_ValueChanged);
            this.txtDebit.ValueChanged += new System.EventHandler(this.txtOrdered_ValueChanged);
        }
        
        /// <summary>
        /// Hàm load form
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnLoad(object sender, EventArgs e)
        {
            //Load default
            SetDefault();
        }
        
        /// <summary>
        /// Thiết lập các giá trị mặc định của form
        /// </summary>
        private void SetDefault()
        {
            //Product
            db = new UnigenDataContext();
            sourceProduct.DataSource = db.Products.Where(p => p.Active == true).ToList();
            //Bind dữ liệu chính
            BindData();
        }

        /// <summary>
        /// Lấy dữ liệu chính
        /// </summary>
        private void BindData()
        {
            try
            {
                //Data bind
                if (refData != null)
                {
                    db = new UnigenDataContext();
                    pnlTitle.Text = "SỬA ĐỔI THÔNG TIN WO";

                    //WO
                    txtWO.Text = refData.WO;
                    //PO
                    txtPO.Text = refData.PO;
                    //SO
                    txtSO.Text = refData.SO;
                    //Product
                    var selectedProduct = (sourceProduct.DataSource as List<Product>).SingleOrDefault(p => p.ProductId == refData.ProductId);
                    if (selectedProduct != null)
                        cboProduct.SelectedValue = selectedProduct.ProductId;

                    txtOrdered.Value = refData.Ordered;
                    txtShipped.Value = refData.Shipped;
                    txtDebit.Value = refData.Debit;
                    txtRemained.Value = refData.Remained;

                    if (refData.Closed ?? false)
                    {
                        btnSave.Enabled = false;
                        pnlTitle.Text = "XEM THÔNG TIN WO \n (Không thể sửa đổi do WO đã được đóng)";
                    }
                }
                else
                    pnlTitle.Text = "THÊM MỚI WO";

            }
            catch (Exception ex)
            {
                Common.ShowErrorMess("BindData - " + ex.Message);
            }
        }

        #endregion

        #region Hàm

        private void Save()
        {
            try
            {
                var wo = txtWO.Text.Trim();
                var po = txtPO.Text.Trim();
                var so = txtSO.Text.Trim();
                var product = Convert.ToInt32(cboProduct.SelectedValue ?? 0);
                var ordered = Common.MaskValueInt(txtOrdered);
                var shipped = Common.MaskValueInt(txtShipped);
                var debit = Common.MaskValueInt(txtDebit);
                var remained = Common.MaskValueInt(txtRemained);

                #region Check valid
                if (String.IsNullOrEmpty(wo))
                {
                    Common.ShowNoticeMess("Nhập số WO!");
                    return;
                }
                if (db.WorldOrders.Count(p=>p.WO == wo) > 0 && action)
                {
                    Common.ShowNoticeMess("Số WO đã tồn tại!");
                    return;
                }
                if (product == 0)
                {
                    Common.ShowNoticeMess("Nhập mặt hàng!");
                    return;
                }
                if (ordered == 0)
                {
                    Common.ShowNoticeMess("Nhập tổng đặt!");
                    return;
                }
                if (remained < 0)
                {
                    Common.ShowNoticeMess("Số tồn bị âm!");
                    return;
                }
                if (remained == 0)
                {
                    if(Common.ShowQuestion("Tồn = 0 là đóng WO. Bạn có chắc chắn?") == DialogResult.Cancel)
                        return;
                }
                if (!action)
                {
                    var totalShippingRequest = db.ShippingRequests.Where(p => p.WOId == refData.WOId).Sum(p => p.Quantity) ?? 0;
                    if (totalShippingRequest > ordered)
                    {//Khi sửa tổng đặt bị nhỏ đi so với lượng dùng để tạo request
                        Common.ShowNoticeMess(String.Format("Các Shipping request có {0} hàng, lớn hơn tổng {1} vừa sửa!",
                            totalShippingRequest.ToString("N0"),
                            ordered));
                        return;
                    }

                    var totalShippingRequestPending = db.ShippingRequests.Where(p => p.WOId == refData.WOId && p.Status == 0).Sum(p => p.Quantity) ?? 0;
                    if (totalShippingRequestPending > remained)
                    {//Khi số tồn bị nhỏ hơn lượng đã dùng để tạo request
                        Common.ShowNoticeMess(String.Format("Có {0} hàng chưa xử lý trong các REQUEST, lớn hơn số tồn {1} vừa sửa!",
                            totalShippingRequestPending.ToString("N0"),
                            remained));
                        return;
                    }
                }
                if (action && remained == 0)
                {
                    if (Common.ShowQuestion("Bạn có chắc để số lượng còn lại = 0?") == DialogResult.Cancel)
                        return;
                }
                #endregion

                db = new UnigenDataContext();
                var w = new WorldOrder();
                if (action)//Thêm mới
                {
                    w.WO = wo;
                    w.PO = po;
                    w.SO = so;
                    w.ProductId = product;
                    w.Ordered = ordered;
                    w.Shipped = shipped;
                    w.Debit = debit;
                    w.Remained = remained;
                    w.Active = true;

                    //Thêm thông tin
                    db.WorldOrders.InsertOnSubmit(w);
                }
                else
                {
                    //Cập nhật thông tin
                    w = db.WorldOrders.SingleOrDefault(pt => pt.WOId == refData.WOId);
                    if (w != null)
                    {
                        w.WO = wo;
                        w.PO = po;
                        w.SO = so;
                        w.ProductId = product;
                        w.Ordered = ordered;
                        w.Shipped = shipped;
                        w.Debit = debit;
                        w.Remained = remained;
                        w.Closed = remained == 0 ? true : false;
                    }
                }

                //Xác nhận
                db.SubmitChanges();

                //Thông báo
                this.ParentForm.DialogResult = DialogResult.OK;
            }
            catch (Exception ex)
            {
                Common.ShowErrorMess("Save - " + ex.Message);
            }
        }

        #endregion

        #region Sự kiện

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
           if (keyData == Keys.Enter && btnSave.Enabled == true && !btnSave.Focused && !btnCancel.Focused && (cboProduct.FocusedElement == null))
            {
                Save();
            }
            if (keyData == Keys.Escape)
            {
                this.ParentForm.DialogResult = DialogResult.Cancel;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        private void txtOrdered_ValueChanged(object sender, EventArgs e)
        {
            txtRemained.Value = Common.MaskValueDecimal(txtOrdered) - Common.MaskValueDecimal(txtShipped) - Common.MaskValueDecimal(txtDebit);
        }

        private void cboProduct_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                if (e.KeyCode == Keys.Enter)
                {
                    var selectedProduct = new Product();
                    var productId = 0;
                    if (int.TryParse(cboProduct.Text.Trim(), out productId))
                        selectedProduct = (sourceProduct.DataSource as List<Product>).SingleOrDefault(p => p.ProductId == productId);
                    else
                        selectedProduct = (sourceProduct.DataSource as List<Product>).FirstOrDefault(p => p.ProductName.Contains(cboProduct.Text.Trim()));

                    if (selectedProduct != null)
                        cboProduct.SelectedValue = selectedProduct.ProductId;
                    else
                        cboProduct.SelectedIndex = 0;
                }
            }
            catch (Exception ex)
            {
                Common.ShowErrorMess("cboProduct_KeyDown - " + ex.Message);
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            Save();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.ParentForm.DialogResult = DialogResult.Cancel;
        }

        #endregion
    }
}
